namespace Study209 {


  // 约束类 


  // 定义动物抽象类
  abstract class Animal {
    // 抽象类名称
    constructor(public name: string) { }

    // 定义抽象方法: 描述动物如何移动
    abstract move(distance: number): void; // 必须在派生类中实现

    // 输出动物的名称
    printName(): void {
      console.log('Animal name: ' + this.name);
    }
  }

  // 定义具体的动物类——蛇类，继承自动物抽象类
  class Snake extends Animal {
    // 调用父类的构造函数，初始化蛇的名称
    constructor() {
      super('蛇'); // 调用父类的构造函数，设置蛇的名称
    }

    // 实现抽象方法：定义蛇如何移动
    move(distance: number): void {
      console.log(`${this.name} 正在蜿蜒地移动...`);
      console.log(`${this.name} 移动了 ${distance} 米。`);
    }

    // 定义蛇类的独特行为
    hiss(): void {
      console.log(`${this.name} 在嘶嘶作响！`);
    }
  }

  // 允许创建一个对抽象类型的引用
  let animal: Animal;
  // animal = new Animal(); // 错误: 无法创建抽象类的实例

  // 创建子类的实例（蛇类）
  animal = new Snake();
  // 调用抽象类中定义的输出名称方法
  animal.printName();
  // 调用蛇类中实现的移动方法
  animal.move(5);
  // animal.hiss(); // 错误: 方法在声明的抽象类中不存在



}

